﻿
namespace Galnote.Web
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.ComponentModel.DataAnnotations;
	using System.Data;
	using System.Linq;
	using System.ServiceModel.DomainServices.EntityFramework;
	using System.ServiceModel.DomainServices.Hosting;
	using System.ServiceModel.DomainServices.Server;


	// 使用 GalnoteModelContainer 上下文实现应用程序逻辑。
	// TODO: 将应用程序逻辑添加到这些方法中或其他方法中。
	// TODO: 连接身份验证(Windows/ASP.NET Forms)并取消注释以下内容，以禁用匿名访问
	//还可考虑添加角色，以根据需要限制访问。
	// [RequiresAuthentication]
	[EnableClientAccess()]
	public class GalnoteDomainService : LinqToEntitiesDomainService<GalnoteModelContainer>
	{

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“CommentSet”查询添加顺序。
		public IQueryable<Comment> GetCommentSet()
		{
			return this.ObjectContext.CommentSet;
		}

		public void InsertComment(Comment comment)
		{
			if ((comment.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(comment, EntityState.Added);
			}
			else
			{
				this.ObjectContext.CommentSet.AddObject(comment);
			}
		}

		public void UpdateComment(Comment currentComment)
		{
			this.ObjectContext.CommentSet.AttachAsModified(currentComment, this.ChangeSet.GetOriginal(currentComment));
		}

		public void DeleteComment(Comment comment)
		{
			if ((comment.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(comment, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.CommentSet.Attach(comment);
				this.ObjectContext.CommentSet.DeleteObject(comment);
			}
		}

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“MailSet”查询添加顺序。
		public IQueryable<Mail> GetMailSet()
		{
			return this.ObjectContext.MailSet;
		}

		public void InsertMail(Mail mail)
		{
			if ((mail.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(mail, EntityState.Added);
			}
			else
			{
				this.ObjectContext.MailSet.AddObject(mail);
			}
		}

		public void UpdateMail(Mail currentMail)
		{
			this.ObjectContext.MailSet.AttachAsModified(currentMail, this.ChangeSet.GetOriginal(currentMail));
		}

		public void DeleteMail(Mail mail)
		{
			if ((mail.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(mail, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.MailSet.Attach(mail);
				this.ObjectContext.MailSet.DeleteObject(mail);
			}
		}

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“ProductSet”查询添加顺序。
		public IQueryable<Product> GetProductSet()
		{
			return this.ObjectContext.ProductSet;
		}

		public void InsertProduct(Product product)
		{
			if ((product.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(product, EntityState.Added);
			}
			else
			{
				this.ObjectContext.ProductSet.AddObject(product);
			}
		}

		public void UpdateProduct(Product currentProduct)
		{
			this.ObjectContext.ProductSet.AttachAsModified(currentProduct, this.ChangeSet.GetOriginal(currentProduct));
		}

		public void DeleteProduct(Product product)
		{
			if ((product.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(product, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.ProductSet.Attach(product);
				this.ObjectContext.ProductSet.DeleteObject(product);
			}
		}

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“ScoreSet”查询添加顺序。
		public IQueryable<Score> GetScoreSet()
		{
			return this.ObjectContext.ScoreSet;
		}

		public void InsertScore(Score score)
		{
			if ((score.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(score, EntityState.Added);
			}
			else
			{
				this.ObjectContext.ScoreSet.AddObject(score);
			}
		}

		public void UpdateScore(Score currentScore)
		{
			this.ObjectContext.ScoreSet.AttachAsModified(currentScore, this.ChangeSet.GetOriginal(currentScore));
		}

		public void DeleteScore(Score score)
		{
			if ((score.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(score, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.ScoreSet.Attach(score);
				this.ObjectContext.ScoreSet.DeleteObject(score);
			}
		}

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“TagSet”查询添加顺序。
		public IQueryable<Tag> GetTagSet()
		{
			return this.ObjectContext.TagSet;
		}

		public void InsertTag(Tag tag)
		{
			if ((tag.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(tag, EntityState.Added);
			}
			else
			{
				this.ObjectContext.TagSet.AddObject(tag);
			}
		}

		public void UpdateTag(Tag currentTag)
		{
			this.ObjectContext.TagSet.AttachAsModified(currentTag, this.ChangeSet.GetOriginal(currentTag));
		}

		public void DeleteTag(Tag tag)
		{
			if ((tag.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(tag, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.TagSet.Attach(tag);
				this.ObjectContext.TagSet.DeleteObject(tag);
			}
		}

		// TODO:
		// 考虑约束查询方法的结果。如果需要其他输入，
		//可向此方法添加参数或创建具有不同名称的其他查询方法。
		// 为支持分页，需要向“UserSet”查询添加顺序。
		public IQueryable<User> GetUserSet()
		{
			return this.ObjectContext.UserSet;
		}

		public void InsertUser(User user)
		{
			if ((user.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Added);
			}
			else
			{
				this.ObjectContext.UserSet.AddObject(user);
			}
		}

		public void UpdateUser(User currentUser)
		{
			this.ObjectContext.UserSet.AttachAsModified(currentUser, this.ChangeSet.GetOriginal(currentUser));
		}

		public void DeleteUser(User user)
		{
			if ((user.EntityState != EntityState.Detached))
			{
				this.ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Deleted);
			}
			else
			{
				this.ObjectContext.UserSet.Attach(user);
				this.ObjectContext.UserSet.DeleteObject(user);
			}
		}
	}
}


